﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;

/*概念*/
//int fmin(int a, int b)
//{
//	return a > b ? b : a;//传值返回，返回的是拷贝
//}
//int main()
//{
//	//以下是左值：可以获取它的地址
//	int* p = new int(0);
//	int b = 1;
//	const int c = 2;
//	"xxxxxxx";//常量字符串是左值：返回的是首元素的地址
//	const char* pc = "xxxx";
//	cout << &("xxxxxx") << endl;
//
//	//以下右值：不能取地址
//	double x = 1.1, y = 2.2;
//	10;
//	x + y;
//	fmin(x, y);//左值: 传值返回返回的临时变量
//	//cout << &10 << endl;
//	//cout << &(x + y) << endl;
//	//cout << &(fmin(x, y)) << endl;;
//	return 0;
//}


//void func(const T& x) //之前提到的用&尽量加const
//int main()
//{
//	//左值引用
//	int a = 10;
//	int& r1 = a;
//
//	//右值引用：给右值取别名
//	int&& r5 = 10;
//	double x = 1.1, y = 2.2;
//	double&& r6 = x + y;//这个临时变量是右值
//
//	//左值引用能否给右值取别名？
//	const int& r2 = 10;//必须加const修饰
//	//右值引用能不能引用左值
//	//int&& ra2 = a;//直接给不可以
//	int&& ra2 = move(a);//需要move一下
//	return 0;
//}

/******************************/
//重载
//void func(const int& r)
//{
//	//cout << "void func(int& r)" << endl;
//	cout << "void func(int& r)" << endl;
//}
//void func(int&& r)
//{
//	cout << "void func(int&& r)" << endl;
//}
//int main()
//{
//	int a = 1, b = 0;
//	func(a);
//	func(a + b);//走更匹配的
//	return 0;
//}

//
#include"string.h"

//fx::string func()
//{
//	fx::string str("xxxxxxxxxx");
//	//return move(str);
//	return str;
//}
//int main()
//{
//	fx::string ret;
//	ret = func();
//
//	fx::string ret1 = func();
//	return 0;
//}


//////////////////////////////////////////////////////////////////
#include<list>
//int main()
//{
//	list<fx::string> lt;
//	fx::string s1("11111111111");
//	lt.push_back(s1);
//	cout << endl;
//	fx::string s2("22222222222");
//	lt.push_back(move(s2));
//
//	cout << endl;
//	lt.push_back("333333");//这里的常量字符串是string类型，隐式类型转换，构造匿名对象在传过去
//	return 0;
//}



/***********完美转发**********/
//void Fun(int& x) { cout << "左值引用" << endl; }
//void Fun(const int& x) { cout << "const 左值引用" << endl; }
//void Fun(int&& x) { cout << "右值引用" << endl; }
//void Fun(const int&& x) { cout << "const 右值引用" << endl; }
//template<class T>
//void PerfectForward(T&& t)
//{
//	//Fun(t);//右值引用的属性只是左值--能够修改
//	Fun(forward<T>(t));//完美转发，保留t的原本属性(是右值就还是右值)
//}
//int main()
//{
//	PerfectForward(10);   //右值
//	int a;
//	PerfectForward(a);   //左值
//	PerfectForward(std::move(a)); // 右值
//	const int b = 8;
//	PerfectForward(b);    //const 左值
//	PerfectForward(std::move(b)); // const 右值
//
//
//	int& r = a;
//	int&& rr = move(a);
//	return 0;
//}



#include"list.h"
//list
//int main()
//{
//	fx::list<fx::string> lt;
//	fx::string s1("11111111111");
//	lt.push_back(s1);
//	cout << endl;
//
//	fx::string s2("22222222222");
//	lt.push_back(move(s2));
//
//	cout << endl;
//	lt.push_back("333333");//这里的常量字符串是string类型，隐式类型转换，构造匿名对象在传过去
//	return 0;
//}
//
//

int main()
{
	fx::string s("xxxxx");
	return 0;
}
